package pingu.joueur;
import org.newdawn.slick.Color;
import java.util.ArrayList;
import pingu.monde.*;

public class Joueur {

	private String pseudo;
	private Color couleur;
	private boolean isLocalPlayer=true;
	private boolean isHuman;
	private ArrayList<Pingouin> mesPingouins;
	private int nbPingouins;
	private int score=0;

	public Joueur(String pseudo, Color couleur, int nbPingouins,boolean localPlayer,boolean isHuman) {
		this.initialiser(pseudo, couleur, nbPingouins,localPlayer,isHuman);
	}

	public void initialiser(String pseudo, Color couleur, int nbPingouins,boolean localPlayer, boolean isHuman){
		this.pseudo=pseudo;
		this.couleur=couleur;
		this.nbPingouins=nbPingouins;
		this.isLocalPlayer=localPlayer;
		this.isHuman=isHuman;
		initialiseArrayAndScore();
	}

	public void initialiseArrayAndScore(){
		mesPingouins=new ArrayList<Pingouin>();
		score=0;
	}
	/**
	 * @return vrai si tous les pingouins ont �t� plac�s, faux sinon
	 */
	public boolean pingouinsTousPlaces(){
		return mesPingouins.size()==nbPingouins;
	}
	
	/**
	 * @param laCase la case sur laquelle placer le pingouin
	 * @return vrai si le pingouin a �t� plac�, faux sinon
	 */
	public boolean placePingouin(Case laCase){

		if(laCase.getNbPoissons()==1 && mesPingouins.size()<nbPingouins&&laCase.estLibre()){
			Pingouin pingouin = new Pingouin(this);
			laCase.setMonPingouin(pingouin);
			mesPingouins.add(pingouin);
			return true;
		}
		else return false;
	}

	/**
	 * 
	 * @param laCase case cliqu�e
	 * @return vrai si un pingouin du joueur a �t� selectionn�, faux sinon
	 */
	public boolean selectionnePingouin(Case laCase){
	
		for (int i = 0; i < nbPingouins; i++) {
			Pingouin pingouinCourant =  mesPingouins.get(i);
			if(pingouinCourant.getCase().equals(laCase)) {
				initSelection();
				pingouinCourant.setSelection(true);
				return true;
			}
		}	
		return false;
	}

	public void initSelection(){
		for (int i = 0; i < mesPingouins.size(); i++) {
			mesPingouins.get(i).setSelection(false);
		}
	}
	
	private void quitterCase(Pingouin pingouin) {
		score+=pingouin.getCase().getNbPoissons();
		pingouin.getCase().setPasFondue(false);
	}	
	
	/**
	 * d�place le pingouin selectionn� vers la case choisie
	 * @param laCase : la case choisie
	 * @return vrai si l'op�ration a pu s'effectuer, faux sinon
	 */
	public boolean deplacePingouinSelectionne(Case laCase){
		Pingouin pingouin=getPingouinSelectionne();
		if(pingouin!=null&&laCase.estLibre()&&laCase.estAtteignableDepuis(pingouin.getCase())){
			quitterCase(pingouin);
			pingouin.changeCase(laCase);
			return true;
		}
		return false;
	}
	
	/**
	 * d�place le pingouin  vers la case choisie
	 * @param laCase : la case choisie
	 * @param pingouin : le pingouin choisi
	 * @return vrai si l'op�ration a pu s'effectuer, faux sinon
	 */
	public boolean deplacePingouin(Pingouin pingouin,Case laCase){
		setPingouinSelectionne(pingouin);
		return deplacePingouinSelectionne(laCase);
	}
		

	public Pingouin getPingouinSelectionne() {
		for (int i = 0; i < mesPingouins.size(); i++) {
			if(mesPingouins.get(i).getSelection()) return mesPingouins.get(i);
		}
		return null;
	}

	public void setPingouinSelectionne(Pingouin pingouin) {
		if(mesPingouins.contains(pingouin))
		{pingouin.setSelection(true);
		}
	}

	public String getPseudo() {
		return pseudo;
	}

	public void setPseudo(String pseudo) {
		this.pseudo = pseudo;
	}

	public Color getCouleur() {
		return couleur;
	}

	public void setCouleur(Color couleur) {
		this.couleur = couleur;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	public ArrayList<Pingouin> getPingouins() {
		return mesPingouins;
	}

	public void setPingouins(ArrayList<Pingouin> ping) {
		mesPingouins=ping;
	}

	public int getNbPingouins() {
		return nbPingouins;
	}

	public void setNbPingouins(int nbPingouins) {
		this.nbPingouins = nbPingouins;
	}

	public boolean isLocalPlayer(){
		return isLocalPlayer;
	}
	public boolean isHuman(){
		return isHuman;
	}
	public void setIsHuman(boolean isHuman){
		this.isHuman=isHuman;
	}
}
